package com.aqielife.demo.example.stream;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;

public class StreamDemo5 {
    public static void main(String[] args) {
        // IntStream.range(1, 100).peek(StreamDemo5::debug2).count();       // 不会执行peek
        // IntStream.range(1, 100).peek(StreamDemo5::debug2).sum();


        System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "5");       // 修改默认线程数
        // 调用parallel 产生一个并行流, 线程池 ： ForkJoinPool.commonPool,默认线程数是当前机器CPU个数,包括主线程
        // IntStream.range(1, 100).parallel().peek(StreamDemo5::debug).sum();

        // 先并行 再串行, 多次调用 parallel / sequential, 以最后一次调用为准.
        /*IntStream.range(1, 100)
                .parallel().peek(StreamDemo5::debug2)       // 并行
                .sequential().peek(StreamDemo5::debug3)     // 串行
                .sum();*/


        // 使用自己的线程池, 不使用默认线程池, 防止任务被阻塞, 线程池名：ForkJoinPool-1
        ForkJoinPool pool = new ForkJoinPool(20);       // 指定线程数
        pool.submit(() -> IntStream.range(1, 100).parallel()
                .peek(StreamDemo5::debug).sum());
        pool.shutdown();                                         // 记得关闭

        // 保证主线程不退出
        synchronized (pool) {
            try {
                pool.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

    public static void debug(int i) {
        System.out.println(Thread.currentThread().getName() + " debug " + i);
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void debug2(int i) {
        System.out.println("debug2 " + i);
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public static void debug3(int i) {
        System.err.println("debug3 " + i);
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
